package ocio.actions;  

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import ocio.beans.Admin;
import ocio.beans.Cliente;
import ocio.beans.Producto;
import ocio.beans.Provincia;
import ocio.beans.Reserva;
import ocio.beans.Subscripcion;
import ocio.beans.Subtipo;
import ocio.services.AdminService;
import ocio.services.ClienteService;
import ocio.services.ServiceLocator;
import ocio.services.ProvinciaService;
import ocio.services.SubscripcionService;
import ocio.services.SubtipoService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase destinataria de petición de alta de una nueva subscripcion.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Subscripcion
 */
public class AddSubscripcionAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private int idUsu; //del admin o del cliente, dependiendo del caso
	private int rol; //1 admin, 2 cliente
	private String tipo; 
	private int idSubtipo;
	private int idProvincia;
	private Cliente cliente;
    private Admin admin;
    private Subtipo subtipo;
    private Provincia provincia;
    private String mensaje; 
	private Set<Subscripcion> listaSubscripciones = new HashSet<Subscripcion>();
	private Set<Producto> listaProductos = new HashSet<Producto>();
	private Set<Reserva> listaReservas = new HashSet<Reserva>();
	private List<Subtipo> listaSubtiposFiltrada = new ArrayList<Subtipo>();

	
    /**
	 * Método execute() de la clase ActionSupport de Struts 2. 
	 * Comprueba que el usuario no tiene ya una subscripción con las mismas caracterísiticas y
	 * solicita las servicios para darla de alta.
	 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario
	 */
	public String execute(){	
			
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		ProvinciaService provinciaService = (ProvinciaService)serviceLocator.getService("Provincia");
		setProvincia((Provincia)provinciaService.searchById(idProvincia));

		
		SubtipoService subtipoService = (SubtipoService)serviceLocator.getService("Subtipo");
	    setSubtipo((Subtipo)subtipoService.searchById(idSubtipo));
		
		SubscripcionService subscripcionService = (SubscripcionService)serviceLocator.getService("Subscripcion");
		
		Map<String,Object> sesion = ActionContext.getContext().getSession();
		
		AdminService adminService = (AdminService)serviceLocator.getService("Admin");
		ClienteService clienteService = (ClienteService)serviceLocator.getService("Cliente");
		
		if (sesion.get("ROL")=="Admin") {  
			//Es el admin el que está dando de alta una subscripcion
			admin=(Admin) adminService.searchById(idUsu);
			rol=admin.getRol();
		} else {
			//Es un cliente el que está dando de alta una subscripcion
			cliente=(Cliente) clienteService.searchById(idUsu);
			rol=cliente.getRol();
		}
				
		boolean ok=false;
		ok=subscripcionService.add(this);
		if (ok) {
			if (sesion.get("ROL")=="Admin") {
				admin=(Admin) adminService.searchById(idUsu);
				listaSubscripciones = admin.getSubscripciones();
				listaProductos = admin.getProductos();
				listaReservas = admin.getReservas();
			} else {
				cliente=(Cliente) clienteService.searchById(idUsu);
				listaSubscripciones= cliente.getSubscripciones();
				listaReservas=cliente.getReservas();
			}	
		} else {
			setMensaje("Ya hay una subscripción con esas condiciones.");
			return "input";
		}	
		return "success";
	}


	public int getRol() {
		return rol;
	}


	public void setRol(int rol) {
		this.rol = rol;
	}

	public String getTipo() {
		return tipo;
	}


	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public int getIdSubtipo() {
		return idSubtipo;
	}


	public void setIdSubtipo(int idsubtipo) {
		this.idSubtipo = idsubtipo;
	}

	public int getIdProvincia() {
		return idProvincia;
	}


	public void setIdProvincia(int idprovincia) {
		this.idProvincia = idprovincia;
	}

	
	public int getIdUsu() {
		return idUsu;
	}


	public void setIdUsu(int idUsu) {
		this.idUsu = idUsu;
	}


	public Cliente getCliente() {
		return cliente;
	}


	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Admin getAdmin() {
		return admin;
	}

	public void setAdmin(Admin admin) {
		this.admin = admin;
	}
	
	
	public Set<Subscripcion> getListaSubscripciones() {
		return listaSubscripciones;
	}


	public void setListaSubscripciones(Set<Subscripcion> listaSubscripciones) {
		this.listaSubscripciones = listaSubscripciones;
	}


	public Subtipo getSubtipo() {
		return subtipo;
	}


	public void setSubtipo(Subtipo subtipo) {
		this.subtipo = subtipo;
	}


	public Provincia getProvincia() {
		return provincia;
	}


	public void setProvincia(Provincia provincia) {
		this.provincia = provincia;
	}


	public String getMensaje() {
		return mensaje;
	}


	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}


	public List<Subtipo> getListaSubtiposFiltrada() {
		return listaSubtiposFiltrada;
	}


	public void setListaSubtiposFiltrada(List<Subtipo> listaSubtiposFiltrada) {
		this.listaSubtiposFiltrada = listaSubtiposFiltrada;
	}


	public Set<Producto> getListaProductos() {
		return listaProductos;
	}


	public void setListaProductos(Set<Producto> listaProductos) {
		this.listaProductos = listaProductos;
	}


	public Set<Reserva> getListaReservas() {
		return listaReservas;
	}


	public void setListaReservas(Set<Reserva> listaReservas) {
		this.listaReservas = listaReservas;
	}
	
	
}
